package com.jingxing.utils;

import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;

/**
 *总工具类
 */
public class TotalUtil {
    public static final String SECRET_ID = "AKID7D4fvuJXHl3293Agx1xo04NRUbU6Zn21";
    public static final String SECRET_KEY = "thGk1R9c2HG4c6JorgHoEVq3JVXT9hz3";
    public static final String REGION = "ap-beijing";
    /**
     * 生产UUID
     * @return
     */
    public static String getUUID(){
        String id = UUID.randomUUID().toString();
        String uid = id.replaceAll("-", "");
        return uid;
    }

    /**
     * 短信 电话，参数，模板
     * @param phone
     * @param templateParam
     * @param templateID
     * @return
     * @throws TencentCloudSDKException
     */
    public static SendSmsResponse getSendSmsResponse(String phone, String templateParam, String templateID, String phone1) throws TencentCloudSDKException {
        String phones="+86"+phone;
        String phones1="+86"+phone1;
        Credential cred = new Credential(SECRET_ID, SECRET_KEY);
        ClientProfile clientProfile = new ClientProfile();
        /* SDK 默认用 TC3-HMAC-SHA256 进行签名
         * 非必要请不要修改该字段 */
        clientProfile.setSignMethod("HmacSHA256");
        SmsClient client = new SmsClient(cred, REGION,clientProfile);
        SendSmsRequest req = new SendSmsRequest();
        String appid = "1400515416";
        req.setSmsSdkAppid(appid);
        /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，可登录 [短信控制台] 查看签名信息 */
        String sign = "鲸喜科技";
        req.setSign(sign);
        /* 模板 ID: 必须填写已审核通过的模板 ID，可登录 [短信控制台] 查看模板 ID */
        req.setTemplateID(templateID);
        /* 模板参数: 若无模板参数，则设置为空*/
        String[] templateParams = {templateParam};
        req.setTemplateParamSet(templateParams);
        /* 下发手机号码，采用 e.164 标准，+[国家或地区码][手机号]
         * 例如+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号*/
        String[] phoneNumbers = {phones};
        if(phone1!=null){
            phoneNumbers = new String[]{phones, phones1};
        }
        req.setPhoneNumberSet(phoneNumbers);
        /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
         * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
        SendSmsResponse res = client.SendSms(req);
        // 输出 JSON 格式的字符串回包
        System.out.println("单发" + SendSmsResponse.toJsonString(res));
        return res;
    }




    private static final char[] DIGITS_LOWER =
            {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    /**
     * KEY+ streamName + txTime
     */
    public static String getSafeUrl(String key, String streamName, long txTime) {
        String input = new StringBuilder().
                append(key).
                append(streamName).
                append(Long.toHexString(txTime).toUpperCase()).toString();

        String txSecret = null;
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            txSecret  = byteArrayToHexString(
                    messageDigest.digest(input.getBytes("UTF-8")));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return txSecret == null ? "" :
                new StringBuilder().
                        append("txSecret=").
                        append(txSecret).
                        append("&").
                        append("txTime=").
                        append(Long.toHexString(txTime).toUpperCase()).
                        toString();
    }

    private static String byteArrayToHexString(byte[] data) {
        char[] out = new char[data.length << 1];

        for (int i = 0, j = 0; i < data.length; i++) {
            out[j++] = DIGITS_LOWER[(0xF0 & data[i]) >>> 4];
            out[j++] = DIGITS_LOWER[0x0F & data[i]];
        }
        return new String(out);
    }

    /**
     * 随机生成Long值
     * @param
     * @return 返回Long值
     * @throws Exception 异常
     */
    public static Long randomLong() {
        String midStr = "";
        byte[] bytes = UUID.randomUUID().toString().getBytes();
        for (int i = 0; i < 10; i++) {
            midStr += String.valueOf(bytes[i]).toCharArray()[String.valueOf(bytes[i]).toCharArray().length - 1];
        }
        return Long.parseLong(midStr);
    }

    public static byte[] base64EncodeUrl(byte[] input) {
        byte[] base64 = Base64.getEncoder().encode(input);
        for (int i = 0; i < base64.length; ++i) {
            switch (base64[i]) {
                case '+':
                    base64[i] = '*';
                    break;
                case '/':
                    base64[i] = '-';
                    break;
                case '=':
                    base64[i] = '_';
                    break;
                default:
                    break;
            }
        }
        return base64;
    }


    public static int comparisonTime(String data) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int i = -1;
        try {
            Date date1 = sdf.parse(data);
            Date date2 = sdf.parse(sdf.format(new Date()));
            i = date1.compareTo(date2);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return i;
    }


    public static String getReminderTime(String date) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//可以方便地修改日期格式
        String dateTime = "";
        try {
            Date parse = dateFormat.parse(date);
            Date now_10 = new Date(parse.getTime() - 600000); //10分钟前的时间
            dateTime = dateFormat.format(now_10);

        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateTime;
    }



    public static SendSmsResponse groupSms(String[] phones, String[] templateParams, String templateID) throws TencentCloudSDKException {
        Credential cred = new Credential(SECRET_ID, SECRET_KEY);
        ClientProfile clientProfile = new ClientProfile();
        /* SDK 默认用 TC3-HMAC-SHA256 进行签名
         * 非必要请不要修改该字段 */
        clientProfile.setSignMethod("HmacSHA256");
        SmsClient client = new SmsClient(cred, REGION,clientProfile);
        SendSmsRequest req = new SendSmsRequest();
        String appid = "1400515416";
        req.setSmsSdkAppid(appid);
        /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，可登录 [短信控制台] 查看签名信息 */
        String sign = "鲸喜科技";
        req.setSign(sign);
        /* 模板 ID: 必须填写已审核通过的模板 ID，可登录 [短信控制台] 查看模板 ID */
        req.setTemplateID(templateID);
        /* 模板参数: 若无模板参数，则设置为空*/
        req.setTemplateParamSet(templateParams);
        /* 下发手机号码，采用 e.164 标准，+[国家或地区码][手机号]
         * 例如+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号*/
        for (int i = 0; i < phones.length; i++) {
            phones[i] = "+86" + phones[i];
        }
        req.setPhoneNumberSet(phones);
        /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
         * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
        SendSmsResponse res = client.SendSms(req);
        // 输出 JSON 格式的字符串回包
        System.out.println("群发" + SendSmsResponse.toJsonString(res));
        return res;
    }


}
